package com.leyou.page.service;

import com.leyou.common.dto.BrandDTO;
import com.leyou.common.dto.CategoryDTO;
import com.leyou.common.dto.SpecGroupDTO;
import com.leyou.common.dto.SpuDTO;
import com.leyou.common.enums.ExceptionEnum;
import com.leyou.common.exceptions.LyException;
import com.leyou.item.client.ItemClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;

import java.io.File;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class PageService {

    @Autowired
    private ItemClient itemClient;

    @Value("${ly.static.itemDir}")
    private String itemDir;

    @Value("${ly.static.itemTemplate}")
    private String itemTemplate;

    @Autowired
    private SpringTemplateEngine templateEngine;

    public void createHtml(Long id){
        //准备Context上下文  其实就是item模板中的数据
        Context context = new Context();
        context.setVariables(loadItemsData(id));
        //创建出写入静态页面所在文件夹文件对象
        File dirFile = new File(itemDir);
        //得到静态文件对象
        File itemFile = new File(dirFile, id+".html");
        //创建打印写入流，来指定把静态页面写到哪个地方去,把流放在try里面可以不用手动关闭，自己会关
        try(PrintWriter printWriter = new PrintWriter(itemFile)) {
            templateEngine.process(itemTemplate, context, printWriter);
        }catch (Exception e){
            throw new LyException(ExceptionEnum.FILE_WRITER_ERROR);
        }


    }

    public Map<String, Object> loadItemsData(Long id) {
        //根据spuId查询SpuDTO  没有
        SpuDTO spuDTO = itemClient.findSpuBySpuId(id);
        //根据上面查询结果中的SpuId查询brand对象 没有
        BrandDTO brandDTO = itemClient.findById(spuDTO.getBrandId());
        //根据上面查询结果中的SpuId查询categories对象集合  有
        List<CategoryDTO> categoryDTOS = itemClient.findByIds(spuDTO.getCategoryIds());
        //查询规格组和组内的参数 没有
        List<SpecGroupDTO> groups = itemClient.findGroupByCidWithParams(spuDTO.getCid3());
        Map<String, Object> map = new HashMap<>();
        map.put("categories", categoryDTOS);//${categories}  Category对象列表
        map.put("brand", brandDTO);//${brand.name}     Brand
        map.put("spuName", spuDTO.getName());//${spuName}     SpuDTO
        map.put("subTitle", spuDTO.getSubTitle());//${subTitle}    SpuDTO
        map.put("detail", spuDTO.getSpuDetail());//${detail.description}   SpuDTO
        map.put("skus", spuDTO.getSkus());//${skus}  SpuDTO
        map.put("specs", groups);//${specs}  [SpecGroupDTO,SpecGroupDTO]
        return map;
    }

    public void removeHtml(Long id) {
        //创建出写入静态页面所在文件夹文件对象
        File dirFile = new File(itemDir);
        //得到静态文件对象
        File itemFile = new File(dirFile, id + ".html");
        //删除文件
        if (itemFile.exists()) {
            itemFile.delete();
        }
    }
}
